package com.example.common.mvi

import com.example.common.Logger
import kotlinx.coroutines.Dispatchers // 协程调度器
import kotlinx.coroutines.flow.Flow // Flow类
import kotlinx.coroutines.flow.flow // 创建Flow的函数
import kotlinx.coroutines.flow.flowOn // 指定Flow运行的调度器
import retrofit2.Response // Retrofit响应类

/**
 * 基础Repository类
 * 提供网络请求的通用方法，统一处理网络请求结果
 */
abstract class BaseRepository {

    /**
     * 安全的网络请求方法
     * 自动处理加载状态、成功状态、错误状态
     * @param apiCall 网络请求的挂起函数
     * @return Flow<NetworkResult<T>> 返回网络结果流
     */
    protected fun <T> safeApiCall(
        apiCall: suspend () -> Response<T> // 网络请求函数
    ): Flow<NetworkResult<T>> = flow { // 创建Flow
        try {
            emit(NetworkResult.Loading) // 首先发送加载状态
            val response = apiCall() // 执行网络请求
            if (response.isSuccessful) { // 判断请求是否成功
                response.body()?.let { data -> // 获取响应体数据
                    emit(NetworkResult.Success(data)) // 发送成功状态和数据
                } ?: emit(NetworkResult.Error(Exception("Response body is null"))) // 响应体为空时发送错误
            } else {
                // HTTP错误，发送错误状态
                emit(NetworkResult.Error(Exception("HTTP ${response.code()}: ${response.message()}")))
            }
        } catch (e: Exception) { // 捕获所有异常
            emit(NetworkResult.Error(e)) // 发送错误状态
        }
    }.flowOn(Dispatchers.IO) // 在IO线程执行

    /**
     * 简单的网络请求方法
     * 不包含Loading状态，直接返回结果
     * @param apiCall 网络请求的挂起函数
     * @return NetworkResult<T> 返回网络结果
     */
    protected suspend fun <T> simpleApiCall(
        apiCall: suspend () -> Response<T> // 网络请求函数
    ): NetworkResult<T> {
        return try {
            val response = apiCall() // 执行网络请求
            if (response.isSuccessful) { // 判断请求是否成功
                response.body()?.let { data -> // 获取响应体数据
                    NetworkResult.Success(data) // 返回成功状态和数据
                } ?: NetworkResult.Error(Exception("Response body is null")) // 响应体为空时返回错误
            } else {
                // HTTP错误，返回错误状态
                NetworkResult.Error(Exception("HTTP ${response.code()}: ${response.message()}"))
            }
        } catch (e: Exception) { // 捕获所有异常
            NetworkResult.Error(e) // 返回错误状态
        }
    }
}